package com.zhongke.common.init.tasks

import android.app.Activity
import android.content.Context
import android.util.Log
import com.zhongke.common.R
import com.zhongke.common.crash.CaocConfig
import com.zhongke.common.crash.CustomActivityOnCrash
import com.zhongke.core.init.ZKIInitTask
import com.zhongke.core.init.ZKInitTaskProduct
import java.lang.Exception


/**
 * crash全部捕获初始化
 */
class ZKCrashTask: ZKIInitTask {

    override fun exe(chain: ZKIInitTask.Chain?): ZKInitTaskProduct? {
        crashBuild(chain?.application)
        return chain?.process()
    }

    private fun crashBuild(context: Context?){
        try {
            val className = "com.zhongke.inisland.home.ui.activity.ZKSplashActivity"
            val aClass = Class.forName(className) as Class<out Activity?>

            //整个配置属性，可以设置一个或多个，也可以一个都不设置
            CaocConfig.Builder.create() //程序在后台时，发生崩溃的三种处理方式
                //BackgroundMode.BACKGROUND_MODE_SHOW_CUSTOM: //当应用程序处于后台时崩溃，也会启动错误页面，
                //BackgroundMode.BACKGROUND_MODE_CRASH:      //当应用程序处于后台崩溃时显示默认系统错误（一个系统提示的错误对话框），
                //BackgroundMode.BACKGROUND_MODE_SILENT:     //当应用程序处于后台时崩溃，默默地关闭程序！这种模式我感觉最好
                .backgroundMode(CaocConfig.BACKGROUND_MODE_SHOW_CUSTOM)
                .enabled(true) //这阻止了对崩溃的拦截,false表示阻止。用它来禁用customactivityoncrash框架
                .showErrorDetails(false) //这将隐藏错误活动中的“错误详细信息”按钮，从而隐藏堆栈跟踪。
                .showRestartButton(true) //是否可以重启页面
                .trackActivities(false) //错误页面中显示错误详细信息
                .minTimeBetweenCrashesMs(5000) //定义应用程序崩溃之间的最短时间，以确定我们不在崩溃循环中。比如：在规定的时间内再次崩溃，框架将不处理，让系统处理！
                .errorDrawable(R.mipmap.ic_launcher) //崩溃页面显示的图标
                .restartActivity(aClass) //重新启动后的页面
                .errorActivity(aClass) //程序崩溃后显示的页面
                .eventListener(CustomEventListener()) //设置监听
                .apply()

            //如果没有任何配置，程序崩溃显示的是默认的设置
            CustomActivityOnCrash.install(context)
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }


    /**
     * 监听程序崩溃/重启
     */
    private class CustomEventListener : CustomActivityOnCrash.EventListener {
        //程序崩溃回调
        override fun onLaunchErrorActivity() {
            Log.e("ZKBaseApplication", "程序崩溃回调")
        }

        //重启程序时回调
        override fun onRestartAppFromErrorActivity() {
            Log.e("ZKBaseApplication", "重启程序时回调")
        }

        //在崩溃提示页面关闭程序时回调
        override fun onCloseAppFromErrorActivity() {
            Log.e("ZKBaseApplication", "在崩溃提示页面关闭程序时回调")
        }
    }

}